# -*- coding: utf-8 -*-
# Create your views here.
from buscador.forms import ProyectoBuscarForm
from django.contrib.auth.decorators import login_required, user_passes_test
from django.core.context_processors import csrf
from django.db.models.query_utils import Q
from django.http import HttpResponseRedirect
from django.shortcuts import render_to_response, get_object_or_404
from django.template.context import RequestContext
from django.views.generic.create_update import update_object, create_object, \
    delete_object
from django.views.generic.list_detail import object_list, object_detail
from forms import ProyectoForm
from proyectos.models import Proyecto
from usuarios.permisos import es_del_grupo_de_expertos




def listar(request):    #seria la pagina de inicio para las proyectos
    return object_list(request,
                       queryset = Proyecto.objects.all(),
                       allow_empty = True,
                       template_name = 'proyectos/listar.html'
                       )
    
def filtrar(request):    #seria la pagina de inicio para las especies
    form = ProyectoBuscarForm()
    q = None
    if request.method == 'POST':
        form = ProyectoBuscarForm(request.POST)
        if form.is_valid():
            q = Proyecto.objects
            if form.cleaned_data['nombre']:
                q =  q.filter(nombre__icontains = form.cleaned_data['nombre'])
            if form.cleaned_data['estado']:
                q =  q.filter(estado = form.cleaned_data['estado'])
            if form.cleaned_data['campo']:
                q =  q.filter(datos = form.cleaned_data['campo'])
            if form.cleaned_data['pais']: #cuando es RelatedObjectManager()
                pais = form.cleaned_data['pais']
                query_set = Q()
                for proy in Proyecto.objects.all():
                    if proy.todos_los_lugares.filter(object_id=pais.id):
                        query_set.add(Q(id = proy.id),Q.OR)
                if query_set:
                    q = q.filter(query_set)
            if form.cleaned_data['institucion']:
                q =  q.filter(instituciones = form.cleaned_data['institucion'])
            if form.cleaned_data['linea']:
                q =  q.filter(lineas_de_investigacion = form.cleaned_data['linea'])
            if q == Proyecto.objects:
                q = None
    return object_list(request,
                       queryset = Proyecto.objects.all(),
                       allow_empty = True,
                       extra_context = {'form' : form, 'detalles' : q },
                       template_name = 'proyectos/filtrar.html'
                       )

@login_required
def ver(request, object_id):
    get_object_or_404(Proyecto, pk=object_id)
    return object_detail(request,
                         queryset = Proyecto.objects.all(),
                         template_object_name =  "Proyecto",
                         template_name = 'proyectos/detalle.html',
                         object_id = object_id
                         ) 




@login_required
@user_passes_test(es_del_grupo_de_expertos,login_url='/accounts/signin/no_experto')
def crear_con_experto(request):
    c={}
    if request.method == 'POST':                            
        form = ProyectoForm(request.POST,request.FILES)                                                
        if form.is_valid():                                  
            new_proyecto = form.save(commit=False)
            try:
                new_proyecto.creador = request.user.get_profile().experto
                new_proyecto.save()  
                form.save_m2m()
            except:
                c.update({'error':u'No tiene perfil de Experto. El Proyecto no se guardó.'})
                c.update(csrf(request))
                c.update({'form':form}) 
                return render_to_response("proyectos/crear.html", c,context_instance=RequestContext(request))
            return HttpResponseRedirect('/proyectos/' + str(new_proyecto.pk))
    else:
        form = ProyectoForm()
        
    c.update(csrf(request))
    c.update({'form':form})                 
    return render_to_response("proyectos/crear.html", c,context_instance=RequestContext(request))


        
@login_required
def crear(request):
    return create_object(request,
                         model = Proyecto, 
                         form_class = ProyectoForm,
                         template_name = 'proyectos/crear.html', 
                         post_save_redirect = '/proyectos/'
                         )     
@login_required
def editar(request, object_id):
    get_object_or_404(Proyecto, pk=object_id)
    return update_object(request,
                         model = Proyecto, 
                         form_class=ProyectoForm,
                         template_name = 'proyectos/editar.html', 
                         post_save_redirect = '/proyectos/' + object_id,
                         object_id = object_id
                         )






@login_required
@user_passes_test(es_del_grupo_de_expertos,login_url='/accounts/signin/no_admin')
def editar_con_experto(request, object_id):
    c = {}
    proyecto = get_object_or_404(Proyecto, pk=object_id)
    try:
        if request.user.get_profile().experto == proyecto.creador:
            return update_object(request,
                         model = Proyecto,
                         form_class = ProyectoForm,
                         template_name = 'proyectos/editar.html',
                         post_save_redirect = '/proyectos/' + object_id,
                         object_id = object_id
                         )
        else:
            c.update({'error':u'Usted tiene perfil de Experto pero no es el creador'})  
            
    except:   
        c.update({'error':u'Usted no tiene perfil de Experto, no puede editar el proyecto'})
    c.update({'titulo_error':u'No se pudo modificar el proyecto'})
    c.update({'object_id':object_id})               
    c.update(csrf(request))
    return render_to_response("proyectos/error.html", c,context_instance=RequestContext(request))




@login_required
def eliminar(request, object_id):
    get_object_or_404(Proyecto, pk=object_id)
    return delete_object(request,
                         model = Proyecto, 
                         template_name = 'proyectos/confirmar_eliminar.html', 
                         post_delete_redirect = '/proyectos/',
                         object_id = object_id
                         )




@login_required
@user_passes_test(es_del_grupo_de_expertos,login_url='/accounts/signin/no_experto')
def eliminar_con_experto(request, object_id):
    c = {}
    proyecto = get_object_or_404(Proyecto, pk=object_id)
    try:
        if request.user.get_profile().experto == proyecto.creador:
            return delete_object(request,
                         model = Proyecto,
                         template_name = 'proyectos/confirmar_eliminar.html',
                         post_delete_redirect = '/proyectos/',
                         object_id = object_id
                         )
        else:
            c.update({'error':u'Usted tiene perfil de Experto pero no es el creador'})  
            
    except:   
        c.update({'error':u'Usted no tiene perfil de Experto'})
    c.update({'titulo_error':u'No se pudo eliminar el proyecto'})
    c.update({'object_id':object_id})               
    c.update(csrf(request))
    return render_to_response("proyectos/error.html", c,context_instance=RequestContext(request))